/* 环形链表模板
 * Author: apleilx
 * Created on 2015年9月3日, 上午9:59
 */

#ifndef __LIST_NODE_TAB_H
#define	__LIST_NODE_TAB_H

#include "stdint.h"

#ifdef	__cplusplus
extern "C" {
#endif

/*******************************************************************************
* @brief  双向链表
*******************************************************************************/
struct dlist_node_str
{
	int32_t element;
	struct dlist_node_str * next;
	struct dlist_node_str *prev;
};
/*******************************************************************************
* @brief  双向链表添加节点
* \param[in] list: 起始节点，如果为0，list=node，且下一个指向自身
* \param[in] prev: 添加位置在prev之后，如果prev为0,添加在list前(即尾)
* \param[in] node: 准备添加的节点
* \retval: 0成功， -1失败
*******************************************************************************/
int8_t dlist_cycle_node_add(struct dlist_node_str ** list, struct dlist_node_str * prev, struct dlist_node_str * node);
/*******************************************************************************
* @brief  双向链表添加节点
* \param[in] list: 起始节点-始终指向最小元素节点
* \param[in] node: 准备添加的节点
* \retval: 0成功， -1失败
*******************************************************************************/
int8_t dlist_cycle_elememt_sort_add(struct dlist_node_str ** list, struct dlist_node_str * node);
/*******************************************************************************
* @brief  双向链表删除节点
* \param[in] list: 起始节点
* \param[in] node: 准备删除的节点
* \retval: 0成功， -1失败
*******************************************************************************/
int8_t dlist_cycle_node_del(struct dlist_node_str ** list, struct dlist_node_str * node);
/*******************************************************************************
* @brief  双向链表删除指定元素的节点
* \param[in] list: 起始节点
* \param[in] element: 准备删除的元素
* \retval: 0成功， -1失败
*******************************************************************************/
int8_t dlist_cycle_element_del(struct dlist_node_str ** list, int32_t element, struct dlist_node_str ** back);
/*******************************************************************************
* @brief  单向链表删除指定元素的节点
* \param[in] list: 起始节点
* \param[in] element: 准备搜索的元素
* \retval: 0成功， -1失败
*******************************************************************************/
int8_t dlist_cycle_element_search(struct dlist_node_str ** list, int32_t element, struct dlist_node_str ** back);

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/*******************************************************************************
* @brief  单向链表
*******************************************************************************/
struct slist_node_str
{
	int32_t element;
	struct slist_node_str * next;
};
/*******************************************************************************
* @brief  单向链表添加节点
* \param[in] list: 起始节点
* \param[in] prev: 添加位置在prev之后，如果prev为0,添加在list前（即尾）
* \param[in] node: 准备添加的节点
* \retval: 0成功， -1失败
*******************************************************************************/
int8_t slist_cycle_node_add(struct slist_node_str ** list, struct slist_node_str * prev, struct slist_node_str * node);
/*******************************************************************************
* @brief  单向链表添加节点-根据元素值排序
* \param[in] list: 起始节点，始终指向最小值节点
* \param[in] node: 准备添加的节点
* \retval: 0成功， -1失败
*******************************************************************************/
int8_t slist_cycle_elememt_sort_add(struct slist_node_str ** list, struct slist_node_str * node);
/*******************************************************************************
* @brief  单向链表删除节点
* \param[in] list: 起始节点
* \param[in] node: 准备删除的节点
* \retval: 0成功， -1失败
*******************************************************************************/
int8_t slist_cycle_node_del(struct slist_node_str ** list, struct slist_node_str * node);
/*******************************************************************************
* @brief  单向链表删除指定元素的节点
* \param[in] list: 起始节点
* \param[in] element: 准备删除的元素
* \retval: 0成功， -1失败
*******************************************************************************/
int8_t slist_cycle_element_del(struct slist_node_str ** list, int32_t element, struct slist_node_str ** back);
/*******************************************************************************
* @brief  单向链表删除指定元素的节点
* \param[in] list: 起始节点
* \param[in] element: 准备删除的元素
* \retval: 0成功， -1失败
*******************************************************************************/
int8_t slist_cycle_element_search(struct slist_node_str ** list, int32_t element, struct slist_node_str ** back);

#ifdef	__cplusplus
}
#endif

#endif	/* __LIST_NODE_TAB_H */

